package cn.juque.workflow.service;

import cn.juque.common.base.PageInfo;
import cn.juque.workflow.bo.*;
import cn.juque.workflow.bo.businesstask.BusinessTaskDetailBO;
import cn.juque.workflow.domain.ProcessTaskDO;
import org.camunda.bpm.engine.history.HistoricTaskInstance;
import org.camunda.bpm.engine.task.Task;

import java.util.List;

/**
 * @author juque
 * @version 1.0.0
 * <ul>
 *     <li>IProcessTaskService</li>
 * </ul>
 * @date 2023-01-28 00:03:39
 **/
public interface IProcessTaskService {

    /**
     * 查询用户的代办
     *
     * @param processTaskDO 查询条件
     * @param pageInfo      分页信息
     * @return List
     */
    List<Task> list(ProcessTaskDO processTaskDO, PageInfo pageInfo);

    /**
     * 查询详情
     *
     * @param processDefinitionKey 流程定义id
     * @param businessId          业务id
     * @return BusinessTaskDetailBO
     */
    BusinessTaskDetailBO<?> detail(String processDefinitionKey, String businessId);

    /**
     * 查询详情
     *
     * @param processDefinitionKey 流程定义key
     * @param taskId          任务ID
     * @return BusinessTaskDetailBO
     */
    BusinessTaskDetailBO<?> detailByTaskId(String processDefinitionKey, String taskId);

    /**
     * 加载bpmn图
     * @param deployId 流程发布ID
     * @return BpmnBO
     */
    BpmnBO loadBpmnByDeployId(String deployId);

    /**
     * 加载bpmn图
     * @param processInstanceId 实例ID
     * @return BpmnBO
     */
    BpmnBO loadBpmnByInstanceId(String processInstanceId);
    /**
     * 创建实例
     *
     * @param saveBO 参数
     */
    void createInstance(InstanceCreateBO saveBO);

    /**
     * 变更实例
     *
     * @param updateBO 参数
     */
    void updateInstance(InstanceUpdateBO updateBO);

    /**
     * 启动实例
     *
     * @param startBO 参数
     */
    void startInstance(InstanceStartBO startBO);

    /**
     * 删除/作废
     *
     * @param processDefinitionKey 流程定义Key
     * @param instanceId          实例ID
     * @param deleteReason        删除原因
     */
    void deleteInstance(String processDefinitionKey, String instanceId, String deleteReason);

    /**
     * 查询已办
     *
     * @param processTaskDO 查询条件
     * @param pageInfo      分页信息
     * @return List
     */
    List<HistoricTaskInstance> listFinish(ProcessTaskDO processTaskDO, PageInfo pageInfo);

    /**
     * 完成任务
     *
     * @param paramBO 参数
     */
    void taskFinish(TaskFinishParamBO paramBO);

    /**
     * 认领任务
     *
     * @param taskId       任务ID
     * @param taskAssignee 用户ID
     */
    void claimTask(String taskId, String taskAssignee);
}
